package ar.edu.caece.compiler.grammar.factories;

import ar.edu.caece.compiler.grammar.AbstractTokenVisitorFactory;
import ar.edu.caece.compiler.grammar.Recognizer;
import ar.edu.caece.compiler.grammar.TokenRecognizer;
import ar.edu.caece.compiler.grammar.TokenVisitor;
import ar.edu.caece.compiler.grammar.attributes.Attribute;
import ar.edu.caece.compiler.grammar.attributes.tree.NodeDeclaraciones;
import ar.edu.caece.compiler.grammar.nonterminals.DECLAGLOBAL;
import ar.edu.caece.compiler.grammar.nonterminals.LISTADECLAGLOBAL;
import ar.edu.caece.compiler.grammar.nonterminals.LISTADECLAGLOBAL1;

public class LISTADECLAGLOBAL1Factory extends AbstractTokenVisitorFactory {

	private static LISTADECLAGLOBAL1Factory INSTANCE;
	
	public static LISTADECLAGLOBAL1Factory getInstance() throws Exception {
		if(INSTANCE==null) INSTANCE = new LISTADECLAGLOBAL1Factory();
		return INSTANCE;
	}
	
	private DECLAGLOBALFactory declaglobalFactory;
	private LISTADECLAGLOBALFactory listadeclaglobalesFactory;
	private TokenVisitor parseDECLAGLOBAL;
	private TokenVisitor parseLISTADECLAGLOBAL;
	
	private Initializer initializer = new Initializer() {
		
		@Override
		public void init() throws Exception {
			initializer = NoOperationInitializer.getInstance();
			declaglobalFactory = DECLAGLOBALFactory.getInstance();
			listadeclaglobalesFactory = LISTADECLAGLOBALFactory.getInstance();
			parseLISTADECLAGLOBAL = listadeclaglobalesFactory.makeVisitor();
			parseDECLAGLOBAL = declaglobalFactory.makeVisitor();
		}
	};
	
	private LISTADECLAGLOBAL1Factory() throws Exception {

	}
	
	@Override
	public TokenVisitor makeChainedVisitor(
			final TokenVisitor siguiente) throws Exception {
		initializer.init();

		return new TokenVisitor() {

			@Override
			public Recognizer defaultCase(TokenRecognizer llamador)
					throws Exception {
				TokenVisitor parseDECLAGLOBAL2 = declaglobalFactory.makeChainedVisitor(siguiente);
				parseDECLAGLOBAL2.addInheritedAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA,getAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA));
				parseDECLAGLOBAL2.addInheritedAttribute(Attribute.ARBOL_HEREDADO, getAttribute(Attribute.ARBOL_HEREDADO));

				Recognizer result = llamador.execute(parseDECLAGLOBAL2);
				if(result instanceof DECLAGLOBAL) {
					
					
					DECLAGLOBAL declaglobal = (DECLAGLOBAL) result;

					parseLISTADECLAGLOBAL.addInheritedAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA,declaglobal.getAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA));
					parseLISTADECLAGLOBAL.addInheritedAttribute(Attribute.ARBOL_HEREDADO,declaglobal.getAttribute(Attribute.ARBOL_HEREDADO));
					
					LISTADECLAGLOBAL listadeclaglobal = (LISTADECLAGLOBAL) nextToken().execute(parseLISTADECLAGLOBAL);
					LISTADECLAGLOBAL1 listadeclaglobal1 = new LISTADECLAGLOBAL1 (declaglobal, listadeclaglobal);
					
					listadeclaglobal1.addAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA,listadeclaglobal.getAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA));

					return listadeclaglobal1;			
				} 
				else {
					return result;
				}
			}
			
		};
	
	}
	@Override
	public TokenVisitor makeVisitor() throws Exception {
		initializer.init();

		return new TokenVisitor() {

			@Override
			public Recognizer defaultCase(TokenRecognizer llamador) throws Exception {
				
				parseDECLAGLOBAL.addInheritedAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA,getAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA));
				parseDECLAGLOBAL.addInheritedAttribute(Attribute.ARBOL_HEREDADO, getAttribute(Attribute.ARBOL_HEREDADO));
				DECLAGLOBAL declaglobal = (DECLAGLOBAL) llamador.execute(parseDECLAGLOBAL);

				parseLISTADECLAGLOBAL.addInheritedAttribute(Attribute.TABLA_SIMBOLOS_HEREDADA,declaglobal.getAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA));
				parseLISTADECLAGLOBAL.addInheritedAttribute(Attribute.ARBOL_HEREDADO,declaglobal.getAttribute(Attribute.ARBOL_HEREDADO));
				
				LISTADECLAGLOBAL listadeclaglobal = (LISTADECLAGLOBAL) nextToken().execute(parseLISTADECLAGLOBAL);
				LISTADECLAGLOBAL1 listadeclaglobal1 = new LISTADECLAGLOBAL1 (declaglobal, listadeclaglobal);
				
				listadeclaglobal1.addAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA,listadeclaglobal.getAttribute(Attribute.TABLA_SIMBOLOS_SINTETIZADA));

				return listadeclaglobal1;
			}
		};
	}
	
	
}
